/*
*
* This file is part of Luces de 1984 (L1).
* Copyright (C) <2017>  <alkeon> [alkeon@autistici.org]
   
* L1 is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* L1 is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with l1.  If not, see <http://www.gnu.org/licenses/>.
*
*/
#include <string>
#include <cstring>
#include <fstream>
#include <sstream>
#include "metodos.h"
#include "personajes.h"
#include <curses.h>
#include <ncurses.h>
using namespace std;

#define VERSION "1.1"

void juego::guardar(std::string guardar,Personaje& v){
	if(this->guardados_automaticos==1 ){
		printa("Narrador:Guardando partida...\n");	
		std::ofstream out("save.dat");
		out << "Nombre: " << v.nombre << "\nVida: " << to_string(v.vida) << "\nAtaque: " << to_string(v.ataque) << "\nBotiquín: " << to_string(v.botiquin) << "\nBalas: " << to_string(v.balas) << "\nDaño " << to_string(v.balas_dano) << "\nGanzúa: " << to_string(v.ganzua) << "\nGuardado: " << guardar << "\nGuardados automáticos: " << to_string(this->guardados_automaticos) << "\nVersión: " << VERSION << "\nPsicosis: " << to_string(v.psicosis) << "\nSoledad: " << to_string(v.soledad) << "\nEsperpento: " << to_string(v.esperpento) << "\nHola Dave: " << to_string(v.hola_dave);
		
		printa("Narrador:Partida guardada.\n");
	}
}
void juego::cargarcompleto(string partida,Personaje& v,Personaje& h){
	string line;
	ifstream in(partida.c_str());
	while(getline(in,line)){

		size_t aux=line.find("Nombre: ");
		if(aux!=std::string::npos){
			line=line.substr(aux+8);
			v.nombre=line;
		}
		aux=line.find("Vida: ");
		if(aux!=std::string::npos){
			line=line.substr(aux+6);
			stringstream(line) >> v.vida;
		}
		aux=line.find("Ataque: ");
		if(aux!=std::string::npos){
			line=line.substr(aux+8);
			stringstream(line) >> v.ataque;
		}
		aux=line.find("Botiquín: ");
		if(aux!=std::string::npos){
			line=line.substr(aux+10);
			stringstream(line) >> v.botiquin;
		}
		aux=line.find("Balas: ");
		if(aux!=std::string::npos){
			line=line.substr(aux+7);
			stringstream(line) >> v.balas;
		}
		aux=line.find("Daño: ");
		if(aux!=std::string::npos){
			line=line.substr(aux+6);
			stringstream(line) >> v.balas_dano;
		}
		aux=line.find("Ganzúa: ");
		if(aux!=std::string::npos){
			line=line.substr(aux+8);
			stringstream(line) >> v.ganzua;
		}
		aux=line.find("Guardado: ");
		if(aux!=std::string::npos){
			line=line.substr(aux+10);
			v.funcion_guardada=line;
		}
		aux=line.find("Guardados automáticos: ");
		if(aux!=std::string::npos){
			line=line.substr(aux+23);
			stringstream(line) >> this->guardados_automaticos;
		}
		aux=line.find("Psicosis: ");
		if(aux!=std::string::npos){
			line=line.substr(aux+10);
			stringstream(line) >> v.psicosis;
		}
		aux=line.find("Soledad: ");
		if(aux!=std::string::npos){
			line=line.substr(aux+8);
			stringstream(line) >> v.soledad;
		}
		aux=line.find("Esperpento: ");
		if(aux!=std::string::npos){
			line=line.substr(aux+12);
			stringstream(line) >> v.esperpento;
		}
		aux=line.find("Hola Dave: ");
		if(aux!=std::string::npos){
			line=line.substr(aux+11);
			stringstream(line) >> v.hola_dave;
		}
	}
	this->cargarnivel(v,h);
}
void juego::cargarnivel(Personaje& v, Personaje& h){
	if(v.funcion_guardada[0]=='a'){
		if(v.funcion_guardada[1]=='2'){
			this->interrogatorio(v,h);
		}
		if(v.funcion_guardada[1]=='3'){
			this->huida(v,h);
		}
		if(v.funcion_guardada[1]=='4'){
			this->provisiones(v,h);
		}
		if(v.funcion_guardada[1]=='5'){
			this->asesinar(v,h);
		}
		if(v.funcion_guardada[1]=='6'){
			this->flashback(v,h);
		}
		if(v.funcion_guardada[1]=='7'){
			this->informacion(v,h);
		}
		if(v.funcion_guardada[1]=='8'){
			this->ira(v,h);
		}
		if(v.funcion_guardada[1]=='9'){
			this->usando_un_ordenador(v,h);
		}
	}else{
		if(v.funcion_guardada[0]=='1'){
			this->preguntas_principales(v,h);
		}
		if(v.funcion_guardada=="-1"){
			v.vida=200;
			v.ataque=20;
			h.vida=80;
			h.ataque=4;
			this->preguntas_principales(v,h);
		}
		if(v.funcion_guardada[1]=='2'){
			this->huida_ruidosa(v,h);
		}
		if(v.funcion_guardada[1]=='3'){
			this->vuelves(v,h);
		}
		if(v.funcion_guardada[1]=='4'){
			this->ayudantes_cerradura(v,h);
		}
		if(v.funcion_guardada[1]=='5'){
			this->muerte_al_francotirador(v,h);
		}
		if(v.funcion_guardada[0]!='1' && v.funcion_guardada[0]!='b'){
			this->preguntas_principales(v,h);
		}
	}
}

void vista_previa_partida(string partida_carga){
	clear();
	string line;
	string nombrel;
	bool partida;
	int vida;
	string version;
	ifstream in(partida_carga.c_str());
	int final1=1;
	int final2=1;
	int final3=1;
	int final4=1;
	while(getline(in,line)){
		size_t aux=line.find("Nombre: ");
		if(aux!=std::string::npos){
			line=line.substr(aux+8);
			nombrel=line;
		}
		aux=line.find("Vida: ");
		if(aux!=std::string::npos){
			line=line.substr(aux+6);
			stringstream(line) >> vida;
		}
		aux=line.find("Versión: ");
		if(aux!=std::string::npos){
			line=line.substr(aux+9);
			version=line;
			partida=true;
		}
		aux=line.find("Psicosis: ");
		if(aux!=std::string::npos){
			line=line.substr(aux+10);
			stringstream(line) >> final1;
		}
		aux=line.find("Soledad: ");
		if(aux!=std::string::npos){
			line=line.substr(aux+8);
			stringstream(line) >> final2;
		}
		aux=line.find("Esperpento: ");
		if(aux!=std::string::npos){
			line=line.substr(aux+12);
			stringstream(line) >> final3;
		}
		aux=line.find("Hola Dave: ");
		if(aux!=std::string::npos){
			line=line.substr(aux+11);
			stringstream(line) >> final4;
		}

	}
	char final1_str[30];
	char final2_str[30];
	char final3_str[30];
	char final4_str[30];
	
	if(final1==0)
			strcpy(final1_str,"Conseguido");
	if(final1==1)
			strcpy(final1_str,"No conseguido");
	if(final2==0)
			strcpy(final2_str,"Conseguido");
	if(final2==1)
			strcpy(final2_str,"No conseguido");
	if(final3==0)
			strcpy(final3_str,"Conseguido");
	if(final3==1)
			strcpy(final3_str,"No conseguido");
	if(final4==0)
			strcpy(final4_str,"Conseguido");
	if(final4==1)
			strcpy(final4_str,"No conseguido");
	if(partida){
			clear();
			
			printw("Partida encontrada\n");
			
			printw("Nombre \t\t\t %s\n",nombrel.c_str());
			printw("Vida \t\t\t %d\n",vida);
			printw("Final 1 \t\t %s\n",final1_str);
			printw("Final 2 \t\t %s\n",final2_str);
			printw("Final 3 \t\t %s\n",final3_str);
			printw("Final 4 \t\t %s\n",final4_str);
			if(final1==0 && final2==0 && final3==0 && final4==0){
				printw("Esta partida ha sido completada con todos los finales. Enhorabuena al jugador y espero que haya disfrutado (dentro de las limitaciones) del juego. \nAtte:Alkeon\n");
			}
			if(version!=VERSION)
				printw("La partida guardada está desactualizada y puede provocar fallos inesperados\n");
			printw("¿Quieres cargar esta partida?\n" );
			printw("1.- Sí \n2.- No\n");
			char eleccion[2];
			getstr(eleccion);
			if(eleccion[0] == '1'){
						juego juego_actual;
						Personaje v(0,20,0,0,0);
						v.nombre=nombrel;
						Personaje h(0,30,0,0,1);
						juego_actual.cargarcompleto("save.dat",v,h);
			}else{
				string partida_guardada;
				juego juego_actual;
				printw("¿Quieres cargar otra partida?\n" );
				printw("1.- Sí \n2.- No\n");
				char str[2];
				getstr(str);
				if(str[0]=='1'){
					printw("Escribe el nombre del archivo:" );
					char partida_mod[100];
					getstr(partida_mod);
					string partida_real(partida_mod);
					vista_previa_partida(partida_real);
				}else{
					juego juego_actual;
					Personaje molde(0,30,0,0,1);
					Personaje Winston(0,20,0,0,0);
					juego_actual.menu(Winston,molde);
				}
			}
	}else{
		printw("Ninguna partida encontrada\n");
		printw("¿Quieres cargar otra partida?\n" );
		printw("1.- Sí \n2.- No\n");
		char str[2];
		getstr(str);
			if(str[0]=='1'){
				printw("Escribe el nombre del archivo:");
				char str2[30];
				getstr(str2);
				string partida_guardada(str2);
				vista_previa_partida(partida_guardada);
						
			}else{
				Personaje molde(0,30,0,0,1);
				Personaje Winston(0,20,0,0,0);
				juego juego_actual;
				juego_actual.menu(Winston,molde);
			}
	}
	
}
